package com.spancer.contentcenter.configuration;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;

import java.util.HashMap;
import java.util.Map;

/**
 * author by: mars
 * Date: 2020/10/7 16:18
 * Description:
 * SpringBoot源码解析（ Chapter-3）
 * 1.系统初始化器实现方式(即：在容器refresh之前初始化自定义的一些内容)
 * > 初始化器：ApplicationContextInitializer
 * > Spring容器刷新之前执行的一个回调函数
 * > 向SpringBoot容器中注册属性
 * > 继承接口自定义实现
 *
 * 第三种实现方式：
 * > 同样创建自定义初始化类，设置自定义配置
 * > 在application.properties/yml 文件中，配置自定义初始化类：
 *   context.initializer.classes=com.spancer.contentcenter.configuration.ThirdInitializer
 * > @Order(x) 设置的值越小，越先执行
 * > 这种配置方式，即使设置了@Order，它的加载顺序依旧会 最先执行，因为 application.properties/yml 配置 优先级高:
 *   run thirdInitializer - mss
 *   run firstInitializer - mss
 *   run secondInitializer - mss
 *
 */
@Order(3)
public class ThirdInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext
                                       applicationContext) {
        // 获取系统环境
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        Map<String,Object> map = new HashMap<>();
        map.put("key3","test3");
        MapPropertySource mapPropertySource = new MapPropertySource("thirdInitializer",map);
        environment.getPropertySources().addLast(mapPropertySource);
        System.out.println("run thirdInitializer - mss ");
    }

}
